package com.scalar.chiptrack.operations.dataentry.inventoryTransit.actioncommands;

import com.scalar.chiptrack.actioncommands.ActionCommand;
import com.scalar.chiptrack.operations.dataentry.inventoryTransit.forms.InventoryTransitForm;
import com.scalar.chiptrack.operations.dataentry.dao.DataEntryDAO;
import com.scalar.chiptrack.operations.process.dao.ProductDao;
import com.scalar.chiptrack.operations.process.dao.NewProductDAO;
import com.scalar.chiptrack.operations.vendor.dao.VendorDAO;
import com.scalar.chiptrack.operations.release.dao.RelaseDAO;
import com.scalar.chiptrack.users.User;
import com.scalar.chiptrack.users.Functionality;
import com.scalar.chiptrack.commons.SessionKeys;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.util.LabelValueBean;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.ArrayList;

/**
 * Created by IntelliJ IDEA.
 * User: munugoti
 * Date: 2 Jun, 2010
 * Time: 4:11:32 PM
 * To change this template use File | Settings | File Templates.
 */
public class ProgramOutTransactionLoadLotNumbersCommand extends ActionCommand
{
    private static final String ACTION_NAME = "/inventoryOutTrans.do";

    public ActionForward execute(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response) throws Exception
    {

        InventoryTransitForm inventoryTransitForm = (InventoryTransitForm) form;

        HashMap<String,String> errors   = new HashMap<String,String>();
        HashMap<String,String> info     = new HashMap<String,String>();
        String action = request.getParameter("action");
        String locationType = null;
        request.setAttribute(INFO_MESSAGES, info);
        request.setAttribute(ERROR_MESSAGES, errors);

        HttpSession mSession = request.getSession();
        User user = (User) mSession.getAttribute(SessionKeys.USER_KEY);

        if (user == null)
        {
            mSession.setAttribute(SessionKeys.SOURCE_PAGE_KEY, ACTION_NAME+"?" + request.getQueryString() );
            return (mapping.findForward("login"));
        }
        else
        {
            if (user.isActionAllowed(Functionality.DATA_ENTRY, User.USER_ACTION_MODIFY))
            {
                request.setAttribute("showMessage", "FALSE");
            }
            else
            {
                request.setAttribute("showMessage", "TRUE");
            }
        }
        ArrayList allRunningWipLotList;

       try
       {
            if ( user.getVendorId() > 0 ) // for VENDOR INTERFACE
            {
                inventoryTransitForm.setLocationId(0);
                if (inventoryTransitForm.getLocationId() == 0 )
                {
                    ArrayList vendorList =  VendorDAO.getInventoryLocationsByProcessByUserType( null, locationType , user.getVendorId() );
                    if ( vendorList != null && vendorList.size() > 0  )
                    {
                        inventoryTransitForm.setLocationId( Integer.parseInt ( ( (LabelValueBean)vendorList.get(0) ).getValue() ) );
                    }
                }
            }

            allRunningWipLotList = DataEntryDAO.getAllRunningHoldLots( LOCATION_TYPE_FG , inventoryTransitForm.getProcessStepId(), inventoryTransitForm.getLocationId(), inventoryTransitForm.getLotId()  );

            if ( allRunningWipLotList == null || allRunningWipLotList.size() == 0 )
            {
                info.put("No " + LOCATION_TYPE_FG + " WIP lots available" , null );
            }
            String parameterValue = NewProductDAO.getProcessParameterValue(null, inventoryTransitForm.getProcessStepId(),  "Is Programmable Part" ) ;
            if (parameterValue != null && "true".equalsIgnoreCase(parameterValue ) )
            {
                int assyPsId = NewProductDAO.getForwardOrBackwardProcessstepId(null, inventoryTransitForm.getProcessStepId(), 0, LOCATION_TYPE_ASSEMBLY );
                if ( assyPsId > 0 )
                {
                    request.setAttribute("toPartNumbersList", NewProductDAO.loadForwardOrBackwardPartNumbers( null, assyPsId, 1, inventoryTransitForm.getProcessStepId(), LOCATION_TYPE_FG, false) );
                }
            }
            else
            {
                String partNo = ProductDao.getProductNameByProcessStep_Id( inventoryTransitForm.getProcessStepId() );
                String likePart = partNo;
                if ( likePart != null && ( likePart.endsWith("T") || likePart.endsWith("Y") ) )
                {
                    likePart = likePart.substring(0, (likePart.length()-1) ) ;
                }

                request.setAttribute("toPartNumbersList", NewProductDAO.loadLikePartsByPartNumber( null, partNo,likePart, LOCATION_TYPE_FG, false ) );
            }
           
            inventoryTransitForm.setWipLotsList( allRunningWipLotList );

            request.setAttribute("lotsList", allRunningWipLotList );
            request.setAttribute("nextLocations",  RelaseDAO.loadProcessVendors( LOCATION_TYPE_FINISHED_GOODS ) );
            request.setAttribute("partNumbersList", ProductDao.loadAllPartsForProcessTypeByPsType( LOCATION_TYPE_FG ) );
            request.setAttribute("locationList", VendorDAO.getInventoryLocationsByProcessByUserType( null, LOCATION_TYPE_FINISHED_GOODS, user.getVendorId() ) );

            request.setAttribute("action", action);
        }
        catch( Exception e)
        {
           errors.put( "Unable to Load Inventory Lots", null);
           e.printStackTrace();
        }
        return mapping.findForward( "programOutTrans" );
    }
}